00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _variable_hpp_
00023 #define _variable_hpp_
00024
00025 #include <iosfwd>
00026 #include <boost/shared_ptr.hpp>
00027 #include <boost/serialization/base_object.hpp>
00028 #include <boost/serialization/shared_ptr.hpp>
00029 #include <gridpack/utilities/uncopyable.hpp>
00030 #include <gridpack/utilities/named.hpp>
00031
00032 namespace gridpack {
00033 namespace optimization {
00034
00035
00036 class Variable;
00037
00038 template <typename T> class BoundedVariableT;
00039 typedef BoundedVariableT<int> IntegerVariable;
00040 typedef BoundedVariableT<double> RealVariable;
00041
00042 class BinaryVariable;
00043
00044
00045
00046
00047 class VariableVisitor
00048 : private utility::Uncopyable
00049 {
00050 public:
00051
00052
00053 VariableVisitor(void);
00054
00055
00056 virtual ~VariableVisitor(void);
00057
00058 virtual void visit(Variable& var);
00059 virtual void visit(RealVariable& var);
00060 virtual void visit(IntegerVariable& var);
00061 virtual void visit(BinaryVariable& var);
00062 };
00063
00064
00065
00066
00067
00068
00069 class Variable
00070 : public utility::Named,
00071 private utility::Uncopyable
00072 {
00073 public:
00074
00075
00076 Variable(void);
00077
00078
00079 virtual ~Variable(void);
00080
00081
00082 int id(void) const
00083 {
00084 return p_id;
00085 }
00086
00087
00088 void id(const int& id)
00089 {
00090 p_id = id;
00091 }
00092
00093
00094 void clear()
00095 {
00096 p_nextID = 0;
00097 }
00098
00099
00100 void accept(VariableVisitor& visitor)
00101 {
00102 this->p_accept(visitor);
00103 }
00104
00105
00106
00107 void setNoInit(bool flag)
00108 {
00109 p_no_init = flag;
00110 }
00111
00112
00113 bool getNoInit()
00114 {
00115 return p_no_init;
00116 }
00117
00118 protected:
00119
00120 static int p_nextID;
00121
00122 int p_id;
00123
00124
00125 virtual void p_accept(VariableVisitor& visitor)
00126 {
00127 visitor.visit(*this);
00128 }
00129
00130 private:
00131
00132 friend class boost::serialization::access;
00133
00134
00135
00136
00137 bool p_no_init;
00138
00139 template<class Archive>
00140 void serialize(Archive &ar, const unsigned int)
00141 {
00142 ar & boost::serialization::base_object<utility::Named>(*this);
00143 ar & p_id;
00144 }
00145
00146 };
00147
00148 typedef boost::shared_ptr<Variable> VariablePtr;
00149
00150
00151
00152
00153
00154 template <typename T>
00155 class BoundedVariableT
00156 : public Variable
00157 {
00158 public:
00159
00160
00161 BoundedVariableT(const T& value)
00162 : Variable(),
00163 p_initial(value),
00164 p_lowBound(veryLowValue),
00165 p_highBound(veryHighValue)
00166 {}
00167
00168
00169 BoundedVariableT(const T& value, const T& lo, const T& hi)
00170 : Variable(),
00171 p_initial(value),
00172 p_lowBound(lo),
00173 p_highBound(hi)
00174 {}
00175
00176
00177 ~BoundedVariableT(void)
00178 {}
00179
00180
00181 T initial(void) const
00182 {
00183 return p_initial;
00184 }
00185
00186
00187 void initial(const T& value)
00188 {
00189 p_initial = value;
00190 }
00191
00192
00193 bool bounded(void) const
00194 {
00195 return ((p_lowBound > veryLowValue) ||
00196 (p_highBound < veryHighValue));
00197 }
00198
00199 T lowerBound(void) const
00200 {
00201 return p_lowBound;
00202 }
00203 T upperBound(void) const
00204 {
00205 return p_highBound;
00206 }
00207
00208
00209 static const T veryLowValue;
00210
00211
00212 static const T veryHighValue;
00213
00214 protected:
00215
00216 T p_initial;
00217 T p_lowBound;
00218 T p_highBound;
00219
00220
00221 BoundedVariableT(void)
00222 : Variable(),
00223 p_initial(),
00224 p_lowBound(veryLowValue),
00225 p_highBound(veryHighValue)
00226 {}
00227
00228
00229 void p_accept(VariableVisitor& visitor)
00230 {
00231 visitor.visit(*this);
00232 }
00233
00234 private:
00235
00236 friend class boost::serialization::access;
00237
00238 template<class Archive>
00239 void serialize(Archive &ar, const unsigned int)
00240 {
00241 ar & boost::serialization::base_object<Variable>(*this);
00242 ar & p_initial & p_lowBound & p_highBound;
00243 }
00244
00245 };
00246
00247
00248
00249
00250
00251 class BinaryVariable
00252 : public BoundedVariableT<int>
00253 {
00254 public:
00255
00256
00257 BinaryVariable(const int& i)
00258 : BoundedVariableT<int>(i)
00259 {
00260 BoundedVariableT<int>::p_highBound = 1;
00261 BoundedVariableT<int>::p_lowBound = 0;
00262 }
00263
00264
00265 ~BinaryVariable(void)
00266 {}
00267
00268 protected:
00269
00270
00271 void p_accept(VariableVisitor& visitor)
00272 {
00273 visitor.visit(*this);
00274 }
00275
00276
00277 BinaryVariable(void)
00278 : BoundedVariableT<int>(0)
00279 {
00280 BoundedVariableT<int>::p_highBound = 1;
00281 BoundedVariableT<int>::p_lowBound = 0;
00282 }
00283
00284 private:
00285
00286 friend class boost::serialization::access;
00287
00288 template<class Archive>
00289 void serialize(Archive &ar, const unsigned int)
00290 {
00291 ar & boost::serialization::base_object<IntegerVariable>(*this);
00292 }
00293 };
00294
00295
00296
00297
00298 class SetVariableInitial
00299 : public VariableVisitor
00300 {
00301 public:
00302
00303
00304 SetVariableInitial(const double& v)
00305 : VariableVisitor(), p_value(v)
00306 {}
00307
00308
00309 ~SetVariableInitial(void)
00310 {}
00311
00312 void visit(RealVariable& var)
00313 {
00314 var.initial(p_value);
00315 }
00316 void visit(IntegerVariable& var)
00317 {
00318 var.initial(static_cast<int>(p_value));
00319 }
00320
00321 protected:
00322
00323 double p_value;
00324 };
00325
00326
00327
00328
00329 class GetVariableInitial
00330 : public VariableVisitor
00331 {
00332 public:
00333
00334
00335 GetVariableInitial(void)
00336 : VariableVisitor(), p_value()
00337 {}
00338
00339
00340 ~GetVariableInitial(void)
00341 {}
00342
00343 void visit(RealVariable& var)
00344 {
00345 p_value = var.initial();
00346 }
00347 void visit(IntegerVariable& var)
00348 {
00349 p_value = static_cast<double>(var.initial());
00350 }
00351
00352 double value(void) const
00353 {
00354 return p_value;
00355 }
00356
00357 protected:
00358
00359 double p_value;
00360 };
00361
00362
00363
00364
00365 class VariableTable
00366 : public VariableVisitor
00367 {
00368 public:
00369
00370
00371 VariableTable(std::ostream& out);
00372
00373
00374 ~VariableTable(void);
00375
00376 void visit(RealVariable& var);
00377 void visit(IntegerVariable& var);
00378 void visit(BinaryVariable& var);
00379
00380 protected:
00381
00382 std::ostream& p_out;
00383
00384 bool p_first;
00385
00386 void p_header(void) const;
00387
00388 };
00389
00390
00391
00392
00393
00394 class VariableCounter
00395 : public VariableVisitor
00396 {
00397 public:
00398
00399
00400 VariableCounter(void);
00401
00402
00403 ~VariableCounter(void);
00404
00405 int numVar;
00406 int numReal;
00407 int numInt;
00408 int numBin;
00409
00410 void visit(Variable& var);
00411 void visit(RealVariable& var);
00412 void visit(IntegerVariable& var);
00413 void visit(BinaryVariable& var);
00414
00415 };
00416
00417 }
00418 }
00419
00420 BOOST_CLASS_EXPORT_KEY(gridpack::optimization::Variable)
00421 BOOST_CLASS_EXPORT_KEY(gridpack::optimization::BoundedVariableT<double>)
00422 BOOST_CLASS_EXPORT_KEY(gridpack::optimization::BoundedVariableT<int>)
00423 BOOST_CLASS_EXPORT_KEY(gridpack::optimization::BinaryVariable)
00424
00425
00426 #endif